package com.yangxf.a_helloworld;

import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class HelloWorld {

	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**
	 * 部署流程定义
	 */
	@Test
	public void deploymentProcessDefinition() {
		
		//这行代码暗中操作了数据库
		Deployment deployment = processEngine.getRepositoryService() // 与流程定义和部署相关的service
			.createDeployment() // 创建一个部署对象
			.name("helloworld入门程序")
			.addClasspathResource("diagrams/helloworld.bpmn") // 从类路径中加载，一次加载一个
			.addClasspathResource("diagrams/helloworld.png")
			.deploy(); // 完成部署
		
		System.out.println(deployment.getId());
		System.out.println(deployment.getName());
	}
	
	/**
	 * 启动流程实例
	 */
	@Test
	public void startProcessInstance() {
		ProcessInstance processInstance = processEngine.getRuntimeService() // 正在执行的流程实例相关的service
				.startProcessInstanceByKey("helloworld"); // 使用流程定义的key启动流程实例，key对应helloworld.bpmn中propertis的id以及act_re_procdef的key_字段，使用key值启动，默认按照最新版本的流程定义启动
				
		System.out.println(processInstance.getId()); // 流程实例id，只有一个 act_ru_execution id_字段
		System.out.println(processInstance.getProcessDefinitionId()); // 流程定义id可能有多个版本 act_re_procdef表id_
	}
	
	/**
	 * 查询当前用户的个人任务
	 */
	@Test
	public void queryOwnTask() {
		List<Task> list = processEngine.getTaskService() // 正在执行的任务相关的service
			.createTaskQuery() // 创建任务查询对象
			.taskAssignee("李四") // 指定个人任务查询，传参办理人
			.list(); // 
		if(list!=null && list.size()>0) {
			for(Task task:list) {
				System.out.println("任务id："+task.getId());
				System.out.println("任务名称："+task.getName());
				System.out.println("任务创建时间："+task.getCreateTime());
				System.out.println("任务的办理人："+task.getAssignee());
				System.out.println("流程实例的id："+task.getProcessInstanceId());
				System.out.println("执行对象id："+task.getExecutionId());
				System.out.println("流程定义id："+task.getProcessDefinitionId());
			}
		}
	}
	
	/**
	 * 完成当前用户任务
	 */
	@Test
	public void finishOwnTask() {
		processEngine.getTaskService()
			.complete("7504"); // 任务id
		System.out.println("完成任务");
	}
}
